package Study0;
import java.util.Arrays;
import java.util.Scanner;

public class Study05 {
    /*数组的四大拷贝方案*/
//    方案四：clone()
    public static void main (String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10};
        int[] ret = arr.clone(); // clone 产生一个副本，这个方法是object 的克隆方法，object:是所有类的父类，祖先
        System.out.println(Arrays.toString(ret));
    }


//    运用 包：System.arraycopy(); 方案三
    public static void main18 (String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10};
        int[] ret = new int[arr.length];
        System.arraycopy(arr,0,ret,0,arr.length);
// System.arraycopy(源数组，开始拷贝的位置，目的数组，拷贝到的位置，拷贝的长度)
        System.out.println(Arrays.toString(ret));
    }


    // 方案二 运用Arrays.copyOf的包使用
    public static void main17 (String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10};
        int[] ret = new int[arr.length];
        ret = Arrays.copyOf(arr,arr.length); // Arrays.copyOf(源数组，拷贝的数组的长度);
        System.out.println(Arrays.toString(arr)); // 数组以字符串的形式，打印数组，对应的包 import java.util.Arrays;
        System.out.println(Arrays.toString(ret));
    }


    public static int[] copyArray (int[] arr) {
        int[] ret = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            ret[i] = arr[i];
        }
        return ret;
    }
public static void main16 (String[] args) {
        Study05 copyArray = new Study05();
    int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10};
    int[] ret = Study05.copyArray(arr);
    for (int num:ret ) {
        System.out.print(num+"\t");
    }

}


//    第一种拷贝方案
    public static void copy1 (int[] arr,int[] ret ) {
        for (int i = 0; i < arr.length; i++) {
            ret[i] = arr[i];
        }
    }
    public static void main15 (String[] args) {
        Study05 copy1 = new Study05();
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10};
        int[] ret = new int[arr.length];
        Study05.copy1(arr,ret);
        for (int num:ret) {
            System.out.print(num+"\t");
        }

    }


    /*数组的探究*/
//    数组引用类型的参数二
    public static void tranSform2 (double[] arr) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i]*3;
        }
    }
    public static void printArray(double[] arr) {
        for (double ret:arr) {
            System.out.print(ret+"\t");
        }
    }
    public static void main14 (String[] args) {
        Study05 tranSform2 = new Study05();
        Study05 printArray2 = new Study05();
        double[] arr = {1.0,2.0,3.0};
        Study05.tranSform2(arr);
        Study05.printArray(arr);
    }


//    数组引用类型参数
    public static void printArray (int[] arr) {
        for (int num:arr) {
            System.out.print(num+"\t");
        }
    }

    public static int[] tranSform(int[] arr) {
        int[] ret = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            ret[i] = arr[i]*2;
        }
        return ret;
    }
    public static void main13 (String[] args) {
        Study05 tranSform = new Study05();
        Study05 printArray = new Study05();
        int[] arr = new int[]{1,2,3};
        Study05.printArray(arr);
        System.out.println("\n 变化后的数值");
        int[] output = Study05.tranSform(arr);
        Study05.printArray(output);
    }


//    数组的置为null;
    public static void main12 (String[] args) {
        int[] arr = null;
        System.out.println(arr);
        int[] array = new int[9];
        System.out.println(array);
    }


//    通过数组进行数值的交换
    public static void printarray (int[] array) {
        int tmp = array[0];
        array[0] = array[1];
        array[1] = tmp;
    }
    public static void main11 (String[] args) {
        Study05 printarray = new Study05();
        int[] array = new int[]{10,90};
        for (int tmp:array) {
//            System.out.println("为交换前的数值：array[0]="+array[0]+"array[1]"+array[1]);
            System.out.print(tmp);
        }
        System.out.println("\n交换后的数值：");
        Study05.printarray(array);
        for (int tmp:array) {
            System.out.print(tmp);
        }

    }


    public static void main10 (String[] args) {
        Scanner scanner = new Scanner(System.in);
        if(scanner.hasNextInt()) {
            int num = scanner.nextInt();
            System.out.println(num);
        }
    }
//    引用类型作为参数
    public static void printarr(int[] array) {
        for (int num:array) {
            System.out.print(num +"\t");
        }

    }

    public static void main9 (String[] args) {
        Study05 printarr = new Study05();
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10};
        Study05.printarr(arr);

    }


//    字符遍历数组
    public static void main8 (String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10};
        for (int num:arr) {
            System.out.print(num);
        }
    }

//    下标越界打印
    public static void main7 (String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10};
        for (int i = 0; i <= arr.length; i++) { // 越界打印了，结果
            System.out.println(arr[i]);
        }
    }
//    下标越界访问示范
    public static  void main6 (String[] args) {
        int[] arr = new int[]{1,2,3};
        System.out.println(arr[3]); // 下标越界访问了
    }

//    以字符的形式打印数组：
    public static void main5 (String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10};
        for (int array:arr) {  // 以字符的形式打印数组    定义一个与数组元素相对应的变量，临时存放记录现在所打印的数值。
            System.out.print(array+"\t");

        }
        System.out.println();
        System.out.println("****************************");
        for (int num:arr
             ) {
            System.out.print(num+"\t");

        }
    }


//    数组打印二
    public static void main4 (String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6};
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

    }


//    打印数组
    public static void main3 (String[] args) {
        int[] array = new int[]{1,2,3,4,5,6};
        int len = array.length;  // 求数组的长度；
        for (int i = 0; i < len; i++) {
            System.out.println(array[i]);
        }
    }


    // 数组的地址
    public static void main2 (String[] args) {
        int[] array = new int[]{1,2,3,4,5,6};
        System.out.println("array ="+array);
        /*注意 Java 是无法拿到地址的，再次鲜明出Java是一种安全语言
        * Java中的地址是被哈希函数加密了过的，但也是具有唯一性的特征，
        * 所以你可以间接的认为是个地址*/
    }



    /*数组的声明，定义*/
    public static void main1 (String[] args) {
        int[] arr ={1,2,3};
        int[] arr1 = new int[]{4,5,6};
        int[] arr2 = new int[3];
//        new 实例化一个对象
//        int[] 引用类型 ——> 与C语言中的指针类似，arr ,arr1,arr2 存放地址；
//        int[] arr,arr,arr2 是在内存栈上的开辟占用空间，存放数据的（指向后面堆区开辟的首地址）
//        而后面的 new ... 是在堆区中开辟空间，存放数据的
        /*Java虚拟机栈    Java本地方法栈
        * 堆     方法区          程序计数器  */
    }
}
